package com.fingard.dsp.bank.directbank.cmbc02;

import com.alibaba.fastjson.JSON;
import com.fingard.constant.Format;
import com.fingard.dsp.bank.directConfig.ActSetItem;
import com.fingard.dsp.bank.directbank.PaymentState;
import com.fingard.dsp.bank.directbank.bankInterface.IBatPayRec;
import com.fingard.dsp.bank.reqrespobj.batpayrec.ReqBatPayRec;
import com.fingard.dsp.bank.reqrespobj.batpayrec.ReqQryBatPayRec;
import com.fingard.dsp.bank.reqrespobj.batpayrec.RetAtsBatPayRec;
import com.fingard.dsp.bank.reqrespobj.batpayrec.RetAtsQryBatPayRec;
import com.fingard.dsp.bank.reqrespobj.batpayrec.detail.RetAtsBatPayRecDetail;
import com.fingard.net.ConnState;
import com.fingard.text.StringHelper;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class CMBC02BatPayRec extends CMBC02Base implements IBatPayRec{
	@Override
	public RetAtsBatPayRec d_1988_BatPay(ReqBatPayRec p_req1988) throws Exception {
		RetAtsBatPayRec retAts = new RetAtsBatPayRec(p_req1988.reqHeader);
		 StringBuilder sbFileContent = new StringBuilder();
		retAts.reqSeqID = p_req1988.reqBatchNO;

		try {
			ActSetItem actItem = getBankConfig().getActSetItem(p_req1988.ownAct, "");
			if(actItem != null) {
			//组装请求报文
			String version="v1.0";//版本号	version	String	16	Y	v1.0，版本号，用于版本控制、灰度发布、向下兼容等用途
			String source="PC";//发起来源	source	String	16	Y	"发起渠道，用于标识iOS、Android、PC等的渠道管控及版本控制PC-PC Web端；iOS-苹果客户端；Android-安卓客户端；"
			String merchantNum=actItem.merchantId;//商户编号	merchantNum	String	32	Y	统一商户编号，由民生银行提供的统一商户编号
			Date timeNow=new Date();
			String transDate=Format.Date8Format.format(timeNow);//交易日期	transDate	String	8	Y	yyyyMMdd
			String transTime=Format.Time9Format.format(timeNow);//交易时间	transTime	String	9	Y	HHMMSSsss
			String transCode="PAY_T011";//交易编码	transCode	String	16	Y	交易编码
			String securityType = "SM203";//安全类型	securityType	String	16	Y	决定使用何种证书、签名、加密算法
			String reserve1 = "";//备用字段1	reserve1	String	16	N	一般备用字段
			String reserve2 = "";//备用字段2	reserve2	String	32	N	一般备用字段
			String reserve3 = "";//备用字段3	reserve3	String	64	N	一般备用字段
			String reserve4 = "";//备用字段4	reserve4	String	128	N	一般备用字段
			String reserve5 = "";//备用字段5	reserve5	String	256	N	一般备用字段
			String reserveJson = "";//通用备用字段	reserveJson	String	512	N	Json格式的通用备用字段｛tokenId：1223232｝在web生命周期管理,在APP端与密钥一一对应
			//业务报文	businessContext	String	4096	N	传递给业务系统的报文

			/*基本解析报文*/
			String agtMerchantNum=actItem.inMerchantId;//代理商户号     必输
			String agtTradeType="30010002";//代理产品编号  必输
			//必输 代理签约编码 为其自己代发时，填写自己的签约编码，为二级商户代发时，填写二级商户的签约编码。签约编码均为民生银行下发。
			String agtContractId=actItem.getBusCode("batchPay");
			String currencyCategory="RMB";//币种
			String cashOrRemitFlag="";//钞汇标识
			String totalAmount=p_req1988.totalAmt;//总金额 必输
			String totalNum=p_req1988.totalNum;//总笔数 必输
			
			//组装指令头
			 sbFileContent.append(agtMerchantNum).append("|");
			 sbFileContent.append(agtTradeType).append("|");
			 sbFileContent.append(agtContractId).append("|");
			 sbFileContent.append(currencyCategory).append("|");
			 sbFileContent.append(cashOrRemitFlag).append("|");
			 sbFileContent.append(totalAmount).append("|");
			 sbFileContent.append(totalNum).append("|");
			 sbFileContent.append("^");
	 
			 WriteBankLogLn("组装好的指令头报文StringBuilder形式："+sbFileContent.toString());
		   	 WriteBankLogLn("组装好的指令头报文："+sbFileContent.toString());
			
			//组装指令明细
			int num=0;
			String recNum;//明细序号    10位数字
			String payeeAccNo;//收款人账号
			String payeeAccName;//收款人户名
			String payeePartyId;//收款人开户行行号
			String payeePartyName;//收款人开户行行名
			String payeeAccType;//收款账户类型
			String payeeNation;//收款人国别
			String payeeCertType;//收款人证件类别
			String payeeCertNo;//收款人证件号码
			String payeeVoucherType;//收款人凭证类型
			String payeeVoucherNo;//收款凭证号码
			String feeId;//手续费项
			String tranAmount;//交易金额
			String isSendMsgToPayee;//是否向收款人发出短信
			String payeeMobileTel;//收款人手机号
			String postscript="";//收款摘要
			String summary="";//收款备注
			String rsv1;//备注1
			String rsv2;//备注2
			String rsv3;//备注3
			String rsv4;//备注4
			String rsv5;//备注5
			String cardtype="";
			
			while(p_req1988.readRecord()){
				recNum=Integer.toString(++num);//明细序号  必输
				payeeAccNo=p_req1988.readedDetail.recAct;//收款人账号 必输
				payeeAccName=p_req1988.readedDetail.recName;//收款人户名 必输
				payeePartyId=p_req1988.readedDetail.cnapsCode;//收款人开户行行号(12位人民银行支付系统行号) 必输
				payeePartyName=p_req1988.readedDetail.recBankName;//收款人开户行行名  
				String isprivate=p_req1988.isPrivate;
				if("1".equals(isprivate)){
					cardtype=p_req1988.readedDetail.cardType;
					if("1".equals(cardtype)){
						payeeAccType="2"; //必输  收款账户类型0-对公活期账户；1-借记卡；2-活期一本通（存折）；7-信用卡；8-对私活期主帐号
					}
					else if("2".equals(cardtype)){
						payeeAccType="1";
					}
					else if("3".equals(cardtype)){
						payeeAccType="7";
					}
					else{
						payeeAccType="8";
					}
				}
				else{
					cardtype=p_req1988.readedDetail.cardType;
					if("1".equals(cardtype)){
						payeeAccType="2";
					}
					else if("2".equals(cardtype)){
						payeeAccType="1";
					}
					else if("3".equals(cardtype)){
						payeeAccType="7";
					}
					else{
						payeeAccType="0";
					}
				}
				
				payeeNation="";//收款人国别
				payeeCertType="";//收款人证件类别
				payeeCertNo="";//收款人证件号码
				payeeVoucherType="";//收款人凭证类型
				payeeVoucherNo="";//收款凭证号码
				feeId="2006";//手续费项 必输
				tranAmount=p_req1988.readedDetail.payAmount;//交易金额 必输
				isSendMsgToPayee="";//是否向收款人发出短信
				payeeMobileTel="";//收款人手机号
				postscript = p_req1988.readedDetail.askNumber;//收款摘要
				summary = p_req1988.readedDetail.purpose;//收款备注`
				if (StringHelper.isNullOrEmpty(summary)) {
                    summary = p_req1988.readedDetail.useType;
                }
				rsv1="";//备注1
				rsv2="";//备注2
				rsv3="";//备注3
				rsv4="";//备注4
				rsv5="";//备注5
				
				
				//组装报文体
				sbFileContent.append(recNum).append("|");
				sbFileContent.append(payeeAccNo).append("|");
				sbFileContent.append(payeeAccName).append("|");
				sbFileContent.append(payeePartyId).append("|");
				sbFileContent.append(payeePartyName).append("|");
				sbFileContent.append(payeeAccType).append("|");
				sbFileContent.append(payeeNation).append("|");
				sbFileContent.append(payeeCertType).append("|");
				sbFileContent.append(payeeCertNo).append("|");
				sbFileContent.append(payeeVoucherType).append("|");
				sbFileContent.append(payeeVoucherNo).append("|");
				sbFileContent.append(feeId).append("|");
				sbFileContent.append(tranAmount).append("|");
				sbFileContent.append(isSendMsgToPayee).append("|");
				sbFileContent.append(payeeMobileTel).append("|");
				sbFileContent.append(summary).append("|");
				sbFileContent.append(postscript).append("|");
				sbFileContent.append(rsv1).append("|");
				sbFileContent.append(rsv2).append("|");
				sbFileContent.append(rsv3).append("|");
				sbFileContent.append(rsv4).append("|");
				sbFileContent.append(rsv5).append("|");
				sbFileContent.append("^");
				num++;
				
			}
			WriteBankLogLn("组装好的报文："+sbFileContent.toString());
			
			
			
			/*//Base64加密
			String fileContent=new String(Base64.encodeBase64(sbFileContent.toString().getBytes("UTF-8")));
			WriteBankLogLn("经过Base64加密后赋值给fileContent的报文："+fileContent);*/
			
			String defaultTradeType="30010002";//交易子类型
			String contractId=actItem.getBusCode("batchPay");
			String batchCount=p_req1988.totalNum;//交易总笔数	batchCount	String	22	Y	
			String batchAmount=p_req1988.totalAmt;//交易总金额	batchAmount	String	22	Y	单位为元，精确到分
			String reqReserved="";
			String riskRateInfo="";
			String userMac="";//终端信息域	userMac	String	256	N	
			String reserved="";//保留域	reserved	String	2000	N
			String orderId="";
			postscript="";
			summary="";
			
			
			
			/*JSONObject businessMessage = new JSONObject();*/
			
			Map<String,String> messagetoBank=new HashMap<String, String>();
			
			messagetoBank.put("version", version);
			messagetoBank.put("source", source);
			messagetoBank.put("merchantNum", merchantNum);
			messagetoBank.put("merchantSeq",p_req1988.reqBatchNO);
			messagetoBank.put("transDate", transDate);
			messagetoBank.put("transTime", transTime);
			messagetoBank.put("transCode", transCode);
			messagetoBank.put("securityType", securityType);
			messagetoBank.put("reserve1", reserve1);
			messagetoBank.put("reserve2", reserve2);
			messagetoBank.put("reserve3", reserve3);
			messagetoBank.put("reserve4", reserve4);
			messagetoBank.put("reserve5", reserve5);
			messagetoBank.put("reserveJson", reserveJson);
			/*messagetoBank.put("businessContext", businessContext);	*/
			
			
			
			messagetoBank.put("defaultTradeType", defaultTradeType);//交易子类型	defaultTradeType	String	16	Y	根据申请产品参考“商户指引”填写，例如：30010002
			messagetoBank.put("contractId", contractId);//签约编码	contractId	String	32	Y	民生银行下发给商户的签约编码，不同交易子类型的签约编码不同
			messagetoBank.put("agtMerchantNum", agtMerchantNum);//代理商户号	agtMerchantNum	String	20	Y	为其自己代发时，填写自己的商户号，为二级商户代发时，填写二级商户的商户号。商户号均为民生银行下发。商户号均为民生银行下发。
			messagetoBank.put("agtTradeType", agtTradeType);//代理交易子类型	agtTradeType	String	20	Y	与交易子类型值相同，例如：30010002
			messagetoBank.put("agtContractId", agtContractId);//代理签约编码	agtContractId	String	32	Y	为其自己代发时，填写自己的签约编码，为二级商户代发时，填写二级商户的签约编码。签约编码均为民生银行下发。
			//messagetoBank.put("orderId", orderId);//订单号	orderId	String	20	N	挡板代付时必输
			messagetoBank.put("batchCount", batchCount);//交易总笔数	batchCount	String	22	Y	
			messagetoBank.put("batchAmount", batchAmount);//交易总金额	batchAmount	String	22	Y	单位为元，精确到分
			messagetoBank.put("fileContentStr", sbFileContent.toString());//文件内容	fileContent	String			txt文本以Base64编码的方式传输。限定批量条数，最多1000条。中文的编码方式为UTF-8
			messagetoBank.put("postscript", postscript);//付款摘要	postscript	String	300	N	
			messagetoBank.put("summary", summary);//付款备注	summary	String	300	N	
			Map<String, String> submitMap = new HashMap<String, String>();
			Map<String, String> busiMap = new HashMap<String, String>();	
			
			initFileContent(messagetoBank);
			splidReqMap(messagetoBank, submitMap, busiMap);
			submitMap.put("businessContext", encodeMsgToString(p_req1988.ownAct, busiMap));
			
			String message=submitMap.toString();
			
			
		//	WriteBankLogLn("发送给银行的报文："+message);
			
			// 发送银行
			String tmpUrl=bankFront.getUrl("Pay");
			
			/*Map<String, String> tmpStrRet = sendToBank(submitMap,tmpUrl);
			WriteBankLogLn("银行返回的报文："+tmpStrRet);
			responseBusiMap = decodeMsg(merchantNum, tmpStrRet);*/
			String[] tmpStrRet = sendToBank(submitMap,tmpUrl);
			if(tmpStrRet[0].length()==0){
				WriteBankLogLn("银行返回的报文："+tmpStrRet[1]);
				//解析银行报文
				HashMap<String, String> reMap=toHashMap(tmpStrRet[1]);
				//Map<String, String> reMap  = (Map<String, String>) JSON.parse(tmpStrRet[1].toString());			
				WriteBankLogLn("解析后银行返回的报文map形式："+reMap);
				WriteBankLogLn("解析后银行返回的报文："+reMap.toString());
				String gateReturnType=reMap.get("gateReturnType");
				String code=reMap.get("gateReturnCode");
				String respInfo=reMap.get("gateReturnMessage");
				if("S".equals(gateReturnType)){
					
					String returnMessage=reMap.get("businessContext");
					WriteBankLogLn("银行返回报文中的businessContext："+returnMessage);
					
					//解密验签
					String returnbody=decodeMsgToString(p_req1988.ownAct, returnMessage);
					WriteBankLogLn("解密结果："+returnbody);
					
				/*	//解Base64编码
					 String decipher=base64ToString(returnbody);
					 WriteBankLogLn("解Base64编码结果"+decipher);*/
				
					 
					 
					Map<String, String> str  = (Map<String, String>) JSON.parse(returnbody.toString());			
					 String busiType=str.get("busiType");
					 String busiCode=str.get("busiCode");
					 String busiMsg=str.get("busiMsg");
					 if("S".equals(busiType)){
						 retAts.respCode="0";
						 retAts.reqSeqID=p_req1988.reqBatchNO;
						 retAts.respInfo=busiMsg;
						 retAts.transState=busiCode;
						 retAts.payInfoCode=busiCode;
					 }
					 else if("R".equals(busiType)){
						 retAts.respCode="0";
						 retAts.respInfo=busiMsg;
						 retAts.payInfoCode=busiCode;
						 retAts.transState=busiCode;
					 }
					 else{
						 retAts.respCode="-1";
						 retAts.respInfo=busiMsg;
						 retAts.payInfoCode=busiCode;
						 retAts.transState=busiCode;
					 }

					
					
				}
				else if("R".equals(gateReturnType)){
					retAts.respCode="0";
					retAts.respInfo=respInfo;
					retAts.transState=code;
					retAts.payInfoCode=code;
				}
				else{
					retAts.respCode="-1";
					retAts.respInfo=respInfo;
					retAts.transState=code;
					retAts.payInfoCode=code;
				}
				
			}
			else if (tmpStrRet[0].equals(ConnState.FAIL)) {
                retAts.respCode = "0";
                retAts.respInfo = tmpStrRet[1];
                retAts.reqSeqID = p_req1988.reqBatchNO;
                retAts.transState = PaymentState.FAIL_Batch;
                retAts.payInfoCode = tmpStrRet[0];
            } else {
                retAts.respCode = "-1";
                retAts.respInfo = tmpStrRet[1];
            }

			}else {
				retAts.respCode = "-1";
				retAts.respInfo = "未找到账号[" + p_req1988.ownAct + "]商户配置信息!";
			}

		} catch (Exception e) {
			// TODO: handle exception
				retAts.respCode="-1";
				retAts.respInfo=e.getMessage();
				WriteBankLogLn(e);
		}
		if ("-1".equals(retAts.respCode) && StringHelper.isNullOrEmpty(retAts.reqSeqID)) {
            retAts.reqSeqID = p_req1988.reqBatchNO;
        }
        retAts.writeRetToATS();
		return retAts;
	}

	//批量代付状态查询
	@Override
	public RetAtsQryBatPayRec d_1998_QryBatPay(ReqQryBatPayRec p_req1998) throws Exception {
		// TODO Auto-generated method stub
		RetAtsQryBatPayRec retAts = new RetAtsQryBatPayRec(p_req1998.reqHeader);
		RetAtsBatPayRecDetail tmpRetDetail = new RetAtsBatPayRecDetail();
		retAts.reqSeqID = p_req1998.reqBatchNO;
		try{
			ActSetItem actItem = getBankConfig().getActSetItem(p_req1998.ownAct, "");
			if(actItem== null) {
				retAts.respCode = "-1";
				retAts.respInfo = "未找到账号[" + p_req1998.ownAct + "]商户配置信息!";
				retAts.writeAfterDetail();
				return retAts;
			}
			//组装请求报文
			String version="v1.0";//版本号	version	String	16	Y	v1.0，版本号，用于版本控制、灰度发布、向下兼容等用途
			String source="PC";//发起来源	source	String	16	Y	"发起渠道，用于标识iOS、Android、PC等的渠道管控及版本控制PC-PC Web端；iOS-苹果客户端；Android-安卓客户端；"
			String merchantNum=actItem.merchantId;//商户编号	merchantNum	String	32	Y	统一商户编号，由民生银行提供的统一商户编号
			String merchantSeq=genMerchantSeq(merchantNum);//商户流水	merchantSeq	String	50	Y	商户发起交易时使用的流水，为防止与其他交易系统流水号重复，特定义流水号组成规则如下：字母、数字、下划线，长度须为50位。 以商户编号为前缀，需补齐后总长度50位
			Date timeNow=new Date();
			String transDate=Format.Date8Format.format(timeNow);//交易日期	transDate	String	8	Y	yyyyMMdd
			String transTime=Format.Time9Format.format(timeNow);//交易时间	transTime	String	9	Y	HHMMSSsss
			String transCode="PAY_Q002";//交易编码	transCode	String	16	Y	交易编码
			String securityType = "SM203";//安全类型	securityType	String	16	Y	决定使用何种证书、签名、加密算法
			String reserve1 = "";//备用字段1	reserve1	String	16	N	一般备用字段
			String reserve2 = "";//备用字段2	reserve2	String	32	N	一般备用字段
			String reserve3 = "";//备用字段3	reserve3	String	64	N	一般备用字段
			String reserve4 = "";//备用字段4	reserve4	String	128	N	一般备用字段
			String reserve5 = "";//备用字段5	reserve5	String	256	N	一般备用字段
			String reserveJson = "";//通用备用字段	reserveJson	String	512	N	Json格式的通用备用字段｛tokenId：1223232｝在web生命周期管理,在APP端与密钥一一对应
			//业务报文	businessContext	String	4096	N	传递给业务系统的报文	
			
			
		//组织业务报文
			//30010002批量代付及查询
		String defaultTradeType="30010002";//交易子类型	defaultTradeType	String	16	Y	根据申请产品参考“商户指引”填写，例如查询代收交易时，填入：30010001,；查询代付交易时，填入30010002
		String contractId=actItem.getBusCode("batchPay");//签约编码	contractId	String	32	Y	民生银行下发给商户的签约编码，不同交易子类型的签约编码不同
		String orgMerchantSeq=p_req1998.reqBatchNO;//原批量交易商户流水	orgMerchantSeq	String	64	Y	发起代收、代付请求的流水号
		String reserved="";//保留域	reserved	String	256	N	


		//发送给银行的报文


		Map<String,String> messagetoBank=new HashMap<String, String>();
		messagetoBank.put("version", version);
		messagetoBank.put("source", source);
		messagetoBank.put("merchantNum", merchantNum);
		messagetoBank.put("merchantSeq", merchantSeq);
		messagetoBank.put("transDate", transDate);
		messagetoBank.put("transTime", transTime);
		messagetoBank.put("transCode", transCode);
		messagetoBank.put("securityType", securityType);
		messagetoBank.put("reserve1", reserve1);
		messagetoBank.put("reserve2", reserve2);
		messagetoBank.put("reserve3", reserve3);
		messagetoBank.put("reserve4", reserve4);
		messagetoBank.put("reserve5", reserve5);
		messagetoBank.put("reserveJson", reserveJson);
		/*messagetoBank.put("businessContext", businessContext);*/
		
		
		messagetoBank.put("defaultTradeType", defaultTradeType);
		messagetoBank.put("contractId", contractId);
		messagetoBank.put("orgMerchantSeq", orgMerchantSeq);
		messagetoBank.put("reserved", reserved);
		
		
		Map<String, String> submitMap = new HashMap<String, String>();
		Map<String, String> busiMap = new HashMap<String, String>();

		splidReqMap(messagetoBank, submitMap, busiMap);
		
		submitMap.put("businessContext", encodeMsgToString(p_req1998.ownAct, busiMap));
	
		String message=submitMap.toString();
		WriteBankLogLn("发送给银行的报文："+message);
		
		String tmpUrl=bankFront.getUrl("Query");
		String s1=tmpUrl;
		String[] tmpStrRet = sendToBank(submitMap,tmpUrl);
		if(tmpStrRet[0].length()==0){
			retAts.respCode = "0";
			WriteBankLogLn("银行返回的报文："+tmpStrRet[1]);
			//解析银行报文
			Map<String, String> reMap  = (Map<String, String>) JSON.parse(tmpStrRet[1].toString());	
			WriteBankLogLn("解析后银行返回的报文map形式："+reMap);
			WriteBankLogLn("解析后银行返回的报文："+reMap.toString());
			String gateReturnType=reMap.get("gateReturnType");
			String code=reMap.get("gateReturnCode");
			String respInfo=reMap.get("gateReturnMessage");
			if("S".equals(gateReturnType)){
				
				String returnMessage=reMap.get("businessContext");
				WriteBankLogLn("银行返回报文中的businessContext："+returnMessage);
				
				//解密验签
				String returnbody=decodeMsgToString(p_req1998.ownAct, returnMessage);
				WriteBankLogLn("解密结果："+returnbody);
		 
				 
				Map<String, String> str  = (Map<String, String>) JSON.parse(returnbody.toString());
						
				 String busiType=str.get("busiType");
				 String busiCode=str.get("busiCode");
				 String busiMsg=str.get("busiMsg");
				 if("S".equals(busiType)){
					String status=str.get("status");
					String returnmessage=str.get("message");
					 if ("".equals(returnmessage)) {
						 returnmessage = busiMsg;
					 }
					 retAts.respCode = "0";
					 retAts.respInfo = returnmessage;
					 retAts.transState = status;
					 retAts.payInfoCode =busiCode;
					 //20 40 50，但是批量代收成功标志是20
					if("20 ".equals(status)||"40".equals(status) || "50".equals(status)){
						String fileContent=str.get("fileContent");
						WriteBankLogLn("返回的未解密的fileContent："+fileContent);
						//Base64解密fileContent
						fileContent=base64ToString(fileContent);
						WriteBankLogLn("Base64解密后的fileContent："+fileContent);

						//将解密后的文件进行分解
						//解析返回文件的数据
						 String[] totalLine = fileContent.split("\r\n");

						 String[] head=totalLine[0].split("\\|");
						 retAts.reqSeqID=head[3];
						 for(int i=1;i<totalLine.length;i++){
						 String[] transbody=totalLine[i].split("\\|");
						 //0=待处理;1=成功;2=失败;R=异常
							 String result=transbody[8];
							 tmpRetDetail.result =status+"+"+ result;
							 tmpRetDetail.recAct=transbody[2];
							 tmpRetDetail.recName=transbody[3];
							 tmpRetDetail.payAmount=transbody[5];
							 tmpRetDetail.usage=transbody[6];
							 tmpRetDetail.memo=transbody[10];
							 tmpRetDetail.payInfoCode = transbody[9];
							 if ("".equals(tmpRetDetail.payInfoCode)) {
								 tmpRetDetail.payInfoCode = result;
							 }
							 tmpRetDetail.postScript = transbody[7];
							 retAts.writeRetDetail(tmpRetDetail);
						 }
					}else  {
						if ("".equals(returnmessage)) {
							returnmessage = busiMsg;
						}
						retAts.respCode = "0";
						retAts.respInfo = returnmessage;
						retAts.transState = status;
						retAts.payInfoCode =status+"+"+ busiCode;
					}
				 }else{
					 if ("UNP36501".equals(busiCode)) { // 无此交易
						 if (!canBeNotExist(p_req1998, retAts, 30)) {
							 retAts.writeAfterDetail();
							 return retAts;
						 }
					 }
					 retAts.respCode="0";
					 retAts.respInfo=busiMsg;
					 retAts.payInfoCode=busiCode;
					 retAts.transState=busiCode;
				 }
			}
			else if("R".equals(gateReturnType)){
				retAts.respCode="0";
				retAts.respInfo=respInfo;
				retAts.transState=code;
				retAts.payInfoCode=code;
			}
			else{
				retAts.respCode="-1";
				retAts.respInfo=respInfo;
				retAts.payInfoCode=code;
				retAts.transState=code;
			
			}
			
		}
		else  {
            retAts.respCode = "-1";
            retAts.respInfo = tmpStrRet[1];
        }
		}
		catch(Exception e){
			retAts.respCode = "-1";
            retAts.respInfo = e.getMessage();
            e.printStackTrace();
			WriteBankLogLn(e);
		}
		 retAts.writeAfterDetail();
		return retAts;
	}

	//批量代收提交
	@Override
	public RetAtsBatPayRec d_9188_BatPay(ReqBatPayRec p_req9188) throws Exception {
		// TODO Auto-generated method stub
		RetAtsBatPayRec retAts = new RetAtsBatPayRec(p_req9188.reqHeader);
		 StringBuilder sbFileContent = new StringBuilder();
		try{

			ActSetItem actItem = getBankConfig().getActSetItem(p_req9188.ownAct, "");
			if(actItem== null) {
				retAts.respCode = "-1";
				retAts.respInfo = "未找到账号[" + p_req9188.ownAct + "]商户配置信息!";
				retAts.writeRetToATS();
				return retAts;
			}
			//组装请求报文
			String version="v1.0";//版本号	version	String	16	Y	v1.0，版本号，用于版本控制、灰度发布、向下兼容等用途
			String source="PC";//发起来源	source	String	16	Y	"发起渠道，用于标识iOS、Android、PC等的渠道管控及版本控制PC-PC Web端；iOS-苹果客户端；Android-安卓客户端；"
			String merchantNum=actItem.merchantId;//商户编号	merchantNum	String	32	Y	统一商户编号，由民生银行提供的统一商户编号
			Date timeNow=new Date();
			String transDate=Format.Date8Format.format(timeNow);//交易日期	transDate	String	8	Y	yyyyMMdd
			String transTime=Format.Time9Format.format(timeNow);//交易时间	transTime	String	9	Y	HHMMSSsss
			String transCode="PAY_T006";//交易编码	transCode	String	16	Y	交易编码
			String securityType = "SM203";//安全类型	securityType	String	16	Y	决定使用何种证书、签名、加密算法
			String reserve1 = "";//备用字段1	reserve1	String	16	N	一般备用字段
			String reserve2 = "";//备用字段2	reserve2	String	32	N	一般备用字段
			String reserve3 = "";//备用字段3	reserve3	String	64	N	一般备用字段
			String reserve4 = "";//备用字段4	reserve4	String	128	N	一般备用字段
			String reserve5 = "";//备用字段5	reserve5	String	256	N	一般备用字段
			String reserveJson = "";//通用备用字段	reserveJson	String	512	N	Json格式的通用备用字段｛tokenId：1223232｝在web生命周期管理,在APP端与密钥一一对应
			//业务报文	businessContext	String	4096	N	传递给业务系统的报文

			//基本解析报文
			String agtMerchantNum=actItem.inMerchantId;//代理商户号     必输
			String agtTradeType="30010001";//代理产品编号  必输
			String agtContractId=actItem.getBusCode("batchRec");//必输 代理签约编码 为其自己代发时，填写自己的签约编码，为二级商户代发时，填写二级商户的签约编码。签约编码均为民生银行下发。
			String feeId="6001";//手续费项 必输
			String currencyCategory="RMB";//币种  必输
			String cashOrRemitFlag="";//钞汇标识
			String totalAmount=p_req9188.totalAmt;//总金额 必输
			String totalNum=p_req9188.totalNum;//总笔数 必输
			
			//组装指令头
		
			 sbFileContent.append(agtMerchantNum).append("|");// 代理商户号
			 sbFileContent.append(agtTradeType).append("|");// 代理产品编号
			 sbFileContent.append(agtContractId).append("|");// 代理签约编码
			 sbFileContent.append(feeId).append("|");// 手续费项
			 sbFileContent.append(currencyCategory).append("|");// 币种
			 sbFileContent.append(cashOrRemitFlag).append("|");// 钞汇标识
			 sbFileContent.append(totalAmount).append("|");// 总金额
			 sbFileContent.append(totalNum).append("|");// 总笔数
			 sbFileContent.append("^");// 换行
			 WriteBankLogLn("组装好的指令头报文StingBuilder形式："+sbFileContent);
			 WriteBankLogLn("组装好的指令头报文："+sbFileContent.toString());
			 
			 //组装明细
			 int num=0;
			 String recNum;// 明细序号	recNum	char	10	必输项
			 String draweePartyId;// 付款行行号	draweePartyId	char	20	非必输项
			 String draweeAcct;// 付款人账号	draweeAcct	char	40	非必输项
			 String draweeAcctType;// 付款人账户类型	draweeAcctType	char	1	非必输项
			 String draweeName;// 付款人户名	draweeName	char	140	非必输项
			 String draweeCertType;// 付款人证件类型	draweeCertType	char	6	非必输项
			 String draweeCertNo;// 付款人证件号	draweeCertNo	char	60	非必输项
			 String draweeMobile;// 付款人手机号	draweeMobile	char	32	非必输项
			 String draweeProtocal;// 付款人协议号	draweeProtocal	char	30	非必输项
			 String amt;// 交易金额	amt	char	16	必输项
			 String pchnl;// 交易通道	pchnl	char	10	非必输项
			 String postScript;// 摘要	postScript	char	300	非必输项
			 String summary;// 备注	summary	char	300	非必输项
			 String rsv1;// 备注1	rsv1	char	255	非必输项
			 String rsv2;// 备注2	rsv2	char	512	非必输项
			 String rsv3;// 备注3	rsv3	char	512	非必输项
			 String rsv4;// 备注4	rsv4	char	1024	非必输项
			 String rsv5;// 备注5	rsv5	char	1024	非必输项

			 while(p_req9188.readRecord()){
				 recNum=Integer.toString(++num);// 明细序号	recNum	char	10	必输项
				 draweePartyId=p_req9188.readedDetail.cnapsCode;// 付款行行号	draweePartyId	char	20	非必输项
				 draweeAcct=p_req9188.readedDetail.payAct;// 付款人账号	draweeAcct	char	40	非必输项
				 draweeAcctType="1";// 付款人账户类型	draweeAcctType	char	1	非必输项
				 draweeName=p_req9188.readedDetail.payName;// 付款人户名	draweeName	char	140	非必输项
				 draweeCertType=convertCertTypeToBank(p_req9188.readedDetail.certType);// 付款人证件类型	draweeCertType	char	6	非必输项
				 draweeCertNo=p_req9188.readedDetail.certNum;// 付款人证件号	draweeCertNo	char	60	非必输项
				 draweeMobile=p_req9188.readedDetail.cellPhone;// 付款人手机号	draweeMobile	char	32	非必输项
				 draweeProtocal="";/*p_req9188.readedDetail.cnapsCode+p_req9188.readedDetail.cnapsName+p_req9188.readedDetail.cardType+p_req9188.readedDetail.payAct+p_req9188.readedDetail.payName;*/// 付款人协议号	draweeProtocal	char	30	非必输项 此字段有值时，取其对应的相关付款人的行号，行名,账户类型，账号,户名
				 if (getBankConfig().getValueAsBool("RecByAuthCode")) {
					 if (StringHelper.hasAnyChar(p_req9188.readedDetail.authCode)) {
						 draweeProtocal = p_req9188.readedDetail.authCode;
					 }
				 }
				 amt=p_req9188.readedDetail.payAmount;// 交易金额	amt	char	16	必输项
				 pchnl="";// 交易通道	pchnl	char	10	非必输项
				 postScript = p_req9188.readedDetail.askNumber;// 摘要	postScript	char	300	非必输项
				 summary = p_req9188.readedDetail.purpose;// 备注	summary	char	300	非必输项
                 if (StringHelper.isNullOrEmpty(summary)) {
                     summary = p_req9188.readedDetail.useType;
                 }

				 rsv1="";// 备注1	rsv1	char	255	非必输项
				 rsv2="";// 备注2	rsv2	char	512	非必输项
				 rsv3="";// 备注3	rsv3	char	512	非必输项
				 rsv4="";// 备注4	rsv4	char	1024	非必输项
				 rsv5="";// 备注5	rsv5	char	1024	非必输项
				 
				 sbFileContent.append(recNum).append("|");// 明细序号
				 sbFileContent.append(draweePartyId).append("|");// 付款行行号
				 sbFileContent.append(draweeAcct).append("|");// 付款人账号
				 sbFileContent.append(draweeAcctType).append("|");// 付款人账户类型
				 sbFileContent.append(draweeName).append("|");// 付款人户名
				 sbFileContent.append(draweeCertType).append("|");// 付款人证件类型
				 sbFileContent.append(draweeCertNo).append("|");// 付款人证件号
				 sbFileContent.append(draweeMobile).append("|");// 付款人手机号
				 sbFileContent.append(draweeProtocal).append("|");// 付款人协议号
				 sbFileContent.append(amt).append("|");// 交易金额
				 sbFileContent.append(pchnl).append("|");// 交易通道
				 sbFileContent.append(summary).append("|");// 摘要
				 sbFileContent.append(postScript).append("|");// 备注
				 sbFileContent.append(rsv1).append("|");// 备注1
				 sbFileContent.append(rsv2).append("|");
				 sbFileContent.append(rsv3).append("|");
				 sbFileContent.append(rsv4).append("|");
				 sbFileContent.append(rsv5).append("|");// 备注5
				 sbFileContent.append("^");// 换行
			 }
			 WriteBankLogLn("组装好的报文StingBuilder形式："+sbFileContent);
			 WriteBankLogLn("组装好的报文："+sbFileContent.toString());
			 
			/*//使用DEFLATE压缩算法压缩后，Base64编码的方式传输
			String fileContent = new String(SecureUtil.base64Encode(SDKUtil.deflater(sbFileContent.toString().getBytes())),getCharset());
			WriteBankLogLn("使用DEFLATE压缩算法压缩后，Base64编码的方式传输存入fileContent："+fileContent);*/
			
			
			//组装业务报文			 
			String defaultTradeType="30010001";//交易子类型
			//签约编码
			String contractId=actItem.getBusCode("batchRec");
			String batchCount=p_req9188.totalNum;//交易总笔数	batchCount	String	22	Y	
			String batchAmount=p_req9188.totalAmt;//交易总金额	batchAmount	String	22	Y	单位为元，精确到分
			String reqReserved="";
			String riskRateInfo="";
			String userMac="";//终端信息域	userMac	String	256	N	
			String reserved="";//保留域	reserved	String	2000	N
			String orderId="";
			String postscript="";
			summary="";
				
			
			//发送给银行的报文	
			Map<String,String> messagetoBank=new HashMap<String, String>();
			messagetoBank.put("version", version);
			messagetoBank.put("source", source);
			messagetoBank.put("merchantNum", merchantNum);
			messagetoBank.put("merchantSeq", p_req9188.reqBatchNO);
			messagetoBank.put("transDate", transDate);
			messagetoBank.put("transTime", transTime);
			messagetoBank.put("transCode", transCode);
			messagetoBank.put("securityType", securityType);
			messagetoBank.put("reserve1", reserve1);
			messagetoBank.put("reserve2", reserve2);
			messagetoBank.put("reserve3", reserve3);
			messagetoBank.put("reserve4", reserve4);
			messagetoBank.put("reserve5", reserve5);
			messagetoBank.put("reserveJson", reserveJson);
			/*messagetoBank.put("businessContext", businessContext);*/
			messagetoBank.put("defaultTradeType", defaultTradeType);//交易子类型	defaultTradeType	String	16	Y	根据申请产品参考“商户指引”填写，例如：30010002
			messagetoBank.put("contractId", contractId);//签约编码	contractId	String	32	Y	民生银行下发给商户的签约编码，不同交易子类型的签约编码不同
			messagetoBank.put("agtMerchantNum", agtMerchantNum);//代理商户号	agtMerchantNum	String	20	Y	为其自己代发时，填写自己的商户号，为二级商户代发时，填写二级商户的商户号。商户号均为民生银行下发。商户号均为民生银行下发。
			messagetoBank.put("agtTradeType", agtTradeType);//代理交易子类型	agtTradeType	String	20	Y	与交易子类型值相同，例如：30010002
			messagetoBank.put("agtContractId", agtContractId);//代理签约编码	agtContractId	String	32	Y	为其自己代发时，填写自己的签约编码，为二级商户代发时，填写二级商户的签约编码。签约编码均为民生银行下发。
			messagetoBank.put("batchCount", batchCount);//交易总笔数	batchCount	String	22	Y	
			messagetoBank.put("batchAmount", batchAmount);//交易总金额	batchAmount	String	22	Y	单位为元，精确到分
			messagetoBank.put("fileContentStr", sbFileContent.toString());//文件内容	fileContent	String			txt文本以Base64编码的方式传输。限定批量条数，最多1000条。中文的编码方式为UTF-8
			messagetoBank.put("postscript", postscript);//付款摘要	postscript	String	300	N	
			messagetoBank.put("summary", summary);//付款备注	summary	String	300	N	
			messagetoBank.put("reqReserved", reqReserved);//请求方保留域	reqReserved	String	256	N	
			messagetoBank.put("riskRateInfo", riskRateInfo);//风险信息域	riskRateInfo	String	256	N	
			messagetoBank.put("userMac", userMac);//终端信息域	userMac	String	256	N	
			messagetoBank.put("reserved", reserved);//保留域	reserved	String	2000	N	
			

			Map<String, String> submitMap = new HashMap<String, String>();
			Map<String, String> busiMap = new HashMap<String, String>();

			
			initFileContent(messagetoBank);
			splidReqMap(messagetoBank, submitMap, busiMap);
			submitMap.put("businessContext", encodeMsgToString(p_req9188.ownAct, busiMap));
			
			String message=submitMap.toString();
			
			
		//	WriteBankLogLn("发送给银行的报文："+message);
			
			// 发送银行
			String tmpUrl=bankFront.getUrl("Pay");
		
			String[] tmpStrRet = sendToBank(submitMap,tmpUrl);
			if(tmpStrRet[0].length()==0){
				Map<String, String> reMap  = (Map<String, String>) JSON.parse(tmpStrRet[1].toString());	
				String gateReturnType=reMap.get("gateReturnType");
				String code=reMap.get("gateReturnCode");
				String respInfo=reMap.get("gateReturnMessage");
				if("S".equals(gateReturnType)){
					
					String returnMessage=reMap.get("businessContext");
					WriteBankLogLn("银行返回报文中的businessContext："+returnMessage);
					
					//解密验签
					String returnbody=decodeMsgToString(p_req9188.ownAct, returnMessage);
					WriteBankLogLn("解密结果："+returnbody);
					
				/*	//解Base64编码
					 String decipher=base64ToString(returnbody);
					 WriteBankLogLn("解Base64编码结果"+decipher);
				*/
					 
					Map<String, String> str  = (Map<String, String>) JSON.parse(returnbody.toString());
									
					 String busiType=str.get("busiType");
					 String busiCode=str.get("busiCode");
					 String busiMsg=str.get("busiMsg");
					 if("S".equals(busiType)){
						 retAts.reqSeqID=p_req9188.reqBatchNO;
						 retAts.respCode="0";
						 retAts.respInfo=busiMsg;
						 retAts.transState=busiCode;
						 retAts.payInfoCode=busiCode;
					 }
					 else if("R".equals(busiType)){
						 retAts.respCode="0";
						 retAts.respInfo=busiMsg;
						 retAts.payInfoCode=busiCode;
						 retAts.transState=busiCode;
					 }
					 else{
						 retAts.respCode="-1";
						 retAts.respInfo=busiMsg;
						 retAts.payInfoCode=busiCode;
						 retAts.transState=busiCode;
					 }
					
					
				}
				else if("R".equals(gateReturnType)){
					retAts.respCode="0";
					retAts.respInfo=respInfo;
					retAts.transState=code;
					retAts.payInfoCode=code;
				}
				else{
					retAts.respCode="-1";
					retAts.respInfo=respInfo;
					retAts.transState=code;
					retAts.payInfoCode=code;
				}
				
				
			}
		
		else if (tmpStrRet[0].equals(ConnState.FAIL)) {
            retAts.respCode = "0";
            retAts.respInfo = tmpStrRet[1];
            retAts.reqSeqID = p_req9188.reqBatchNO;
            retAts.transState = PaymentState.FAIL_Batch;
            retAts.payInfoCode = tmpStrRet[0];
        }
			
			else {
				retAts.respCode="-1";
				retAts.respInfo=tmpStrRet[1];
			}
			
		}catch(Exception e){
			retAts.respCode="-1";
			retAts.respInfo=e.getMessage();
			WriteBankLogLn(e);
		}
		if ("-1".equals(retAts.respCode) && StringHelper.isNullOrEmpty(retAts.reqSeqID)) {
            retAts.reqSeqID = p_req9188.reqBatchNO;
        }
		retAts.writeRetToATS();
		return retAts;
	}

	// 批量代收状态查询
	@Override
	public RetAtsQryBatPayRec d_9198_QryBatPay(ReqQryBatPayRec p_req9198) throws Exception {
		// TODO Auto-generated method stub
		RetAtsQryBatPayRec retAts = new RetAtsQryBatPayRec(p_req9198.reqHeader);
		RetAtsBatPayRecDetail tmpRetDetail = new RetAtsBatPayRecDetail();
        retAts.reqSeqID = p_req9198.reqBatchNO;
		try{
			ActSetItem actItem = getBankConfig().getActSetItem(p_req9198.ownAct, "");
			if(actItem== null) {
				retAts.respCode = "-1";
				retAts.respInfo = "未找到账号[" + p_req9198.ownAct + "]商户配置信息!";
				retAts.writeAfterDetail();
				return retAts;
			}
			//组装请求报文
			String version="v1.0";//版本号	version	String	16	Y	v1.0，版本号，用于版本控制、灰度发布、向下兼容等用途
			String source="PC";//发起来源	source	String	16	Y	"发起渠道，用于标识iOS、Android、PC等的渠道管控及版本控制PC-PC Web端；iOS-苹果客户端；Android-安卓客户端；"
			String merchantNum=actItem.merchantId;//商户编号	merchantNum	String	32	Y	统一商户编号，由民生银行提供的统一商户编号
			String merchantSeq=genMerchantSeq(merchantNum);//商户流水	merchantSeq	String	50	Y	商户发起交易时使用的流水，为防止与其他交易系统流水号重复，特定义流水号组成规则如下：字母、数字、下划线，长度须为50位。 以商户编号为前缀，需补齐后总长度50位
			Date timeNow=new Date();
			String transDate=Format.Date8Format.format(timeNow);//交易日期	transDate	String	8	Y	yyyyMMdd
			String transTime=Format.Time9Format.format(timeNow);//交易时间	transTime	String	9	Y	HHMMSSsss
			String transCode="PAY_Q002";//交易编码	transCode	String	16	Y	交易编码
			String securityType = "SM203";//安全类型	securityType	String	16	Y	决定使用何种证书、签名、加密算法
			String reserve1 = "";//备用字段1	reserve1	String	16	N	一般备用字段
			String reserve2 = "";//备用字段2	reserve2	String	32	N	一般备用字段
			String reserve3 = "";//备用字段3	reserve3	String	64	N	一般备用字段
			String reserve4 = "";//备用字段4	reserve4	String	128	N	一般备用字段
			String reserve5 = "";//备用字段5	reserve5	String	256	N	一般备用字段
			String reserveJson = "";//通用备用字段	reserveJson	String	512	N	Json格式的通用备用字段｛tokenId：1223232｝在web生命周期管理,在APP端与密钥一一对应
			//业务报文	businessContext	String	4096	N	传递给业务系统的报文	
			
			
		//组织业务报文
		
		String defaultTradeType="30010001";//交易子类型	defaultTradeType	String	16	Y	根据申请产品参考“商户指引”填写，例如查询代收交易时，填入：30010001,；查询代付交易时，填入30010002
		String contractId=actItem.getBusCode("batchRec");//签约编码	contractId	String	32	Y	民生银行下发给商户的签约编码，不同交易子类型的签约编码不同
		String orgMerchantSeq=p_req9198.reqBatchNO;//原批量交易商户流水	orgMerchantSeq	String	64	Y	发起代收、代付请求的流水号
		String reserved="";//保留域	reserved	String	256	N	

		
		
		
		//发送给银行的报文
		Map<String,String> messagetoBank=new HashMap<String, String>();
		messagetoBank.put("version", version);
		messagetoBank.put("source", source);
		messagetoBank.put("merchantNum", merchantNum);
		messagetoBank.put("merchantSeq", merchantSeq);
		messagetoBank.put("transDate", transDate);
		messagetoBank.put("transTime", transTime);
		messagetoBank.put("transCode", transCode);
		messagetoBank.put("securityType", securityType);
		messagetoBank.put("reserve1", reserve1);
		messagetoBank.put("reserve2", reserve2);
		messagetoBank.put("reserve3", reserve3);
		messagetoBank.put("reserve4", reserve4);
		messagetoBank.put("reserve5", reserve5);
		messagetoBank.put("reserveJson", reserveJson);
	/*	messagetoBank.put("businessContext", businessContext);*/
		
		messagetoBank.put("defaultTradeType", defaultTradeType);
		messagetoBank.put("contractId", contractId);
		messagetoBank.put("orgMerchantSeq", orgMerchantSeq);
		messagetoBank.put("reserved", reserved);
		
		
		Map<String, String> submitMap = new HashMap<String, String>();
		Map<String, String> busiMap = new HashMap<String, String>();

		initFileContent(messagetoBank);
		splidReqMap(messagetoBank, submitMap, busiMap);
		submitMap.put("businessContext", encodeMsgToString(p_req9198.ownAct, busiMap));
		
		String message=messagetoBank.toString();
		WriteBankLogLn("发送给银行的报文："+message);
		
		
		String tmpUrl=bankFront.getUrl("Query");
		String[] tmpStrRet = sendToBank(submitMap,tmpUrl);
		if(tmpStrRet[0].length()==0){
			WriteBankLogLn("银行返回的报文："+tmpStrRet[1]);
			//解析银行报文
			Map<String, String> reMap  = (Map<String, String>) JSON.parse(tmpStrRet[1].toString());	
			WriteBankLogLn("解析后银行返回的报文map形式："+reMap);
			WriteBankLogLn("解析后银行返回的报文："+reMap.toString());
			String gateReturnType=reMap.get("gateReturnType");
			String code=reMap.get("gateReturnCode");
			String respInfo=reMap.get("gateReturnMessage");
			if("S".equals(gateReturnType)){
				
				String returnMessage=reMap.get("businessContext");
				WriteBankLogLn("银行返回报文中的businessContext："+returnMessage);
				
				//解密验签
				String returnbody=decodeMsgToString(p_req9198.ownAct, returnMessage);
				WriteBankLogLn("解密结果："+returnbody);
				
				/*//解Base64编码
				 String decipher=base64ToString(returnbody);
				 WriteBankLogLn("解Base64编码结果"+decipher);
			*/
			Map<String, String> str  = (Map<String, String>) JSON.parse(returnbody.toString());	
				 
					
				 String busiType=str.get("busiType");
				 String busiCode=str.get("busiCode");
				 String busiMsg=str.get("busiMsg");
				retAts.respCode = "0";
				 if("S".equals(busiType)){
					String status=str.get("status");
					String returnmessage=str.get("message");
					//20 40 50，但是批量代收成功标志是20
					if("20".equals(status)||"40".equals(status) || "50".equals(status)){
						String fileContent=str.get("fileContent");
						WriteBankLogLn("返回的未解密的fileContent："+fileContent);
						//Base64解密fileContent
						fileContent=base64ToString(fileContent);
						WriteBankLogLn("Base64解密后的fileContent："+fileContent);
						
						//将解密后的文件进行分解
						//解析返回文件的数据
						 String[] totalLine = fileContent.split("\r\n");
						 if (StringHelper.isNullOrEmpty(retAts.reqSeqID)) {
							 retAts.reqSeqID = p_req9198.reqBatchNO;
						 }
					
						 String[] head=totalLine[0].split("\\|");
						 retAts.reqSeqID=head[3];
						 for(int i=1;i<totalLine.length;i++){
							 String[] transbody=totalLine[i].split("\\|");
							 //0=待处理;1=成功;2=失败;R=异常
							 String result=transbody[11];
							 tmpRetDetail.result =status+"+"+ result;
							 tmpRetDetail.payAct=transbody[3];
							 tmpRetDetail.payName=transbody[4];
							 tmpRetDetail.payAmount=transbody[8];
							 tmpRetDetail.postScript = transbody[10];
							 tmpRetDetail.usage=transbody[9];
							 tmpRetDetail.memo=transbody[13];
							 tmpRetDetail.payInfoCode = transbody[12];
							 if ("".equals(tmpRetDetail.payInfoCode)) {
								 tmpRetDetail.payInfoCode = result;
							 }

							 retAts.writeRetDetail(tmpRetDetail);
						 }
					}else{
						if ("".equals(returnmessage)) {
							returnmessage = busiMsg;
						}

						 retAts.respInfo = returnmessage;
						 retAts.transState = status;
						 retAts.payInfoCode =status+"+"+ busiCode;
					 }
				 }else{
					 if ("UNP36501".equals(busiCode)) { // 无此交易
						 if (!canBeNotExist(p_req9198, retAts, 30)) {
							 retAts.writeAfterDetail();
							 return retAts;
						 }
					 }
					 retAts.respInfo=busiMsg;
					 retAts.payInfoCode=busiCode;
					 retAts.transState=busiCode;

				 }
			}	else if("R".equals(gateReturnType)){
				retAts.respCode="0";
				retAts.respInfo=respInfo;
				retAts.transState=code;
				retAts.payInfoCode=code;
			}
			else{
				retAts.respCode="-1";
				retAts.respInfo=respInfo;
				retAts.payInfoCode=code;
				retAts.transState=code;
			}
		}else{
			retAts.respCode="-1";
			retAts.respInfo=tmpStrRet[1];
		}
		
		}
		catch(Exception e){
			retAts.respCode = "-1";
            retAts.respInfo = e.getMessage();
            e.printStackTrace();
			WriteBankLogLn(e);
		}
	        retAts.writeAfterDetail();
		return retAts;
	}

}
